var data = {};
var callbacks = [];
var sync = false;
var nim;
var Event = new Vue();
import Vue from 'vue'

export function im_ini(account = null, token = null) {
  // if (!account && !token) {
  account = localStorage.zyGameID
  token = localStorage.chatLoginToken;
  // }

  console.log(account)
  console.log(token)
  if (!account && !token) { //提示没有账号错误
    //错误处理
    return;
  }

  // 注意这里, 引入的 SDK 文件不一样的话, 你可能需要使用 SDK.NIM.getInstance 来调用接口
  //测试 45c6af3c98409b18a84451215d0bdd6e a123456 e10adc3949ba59abbe56e057f20f883e
  //生产 ffa917c9f0409333abd0cbc2dc197df1
  // account = 'a123456';
  // token = 'e10adc3949ba59abbe56e057f20f883e';
  nim = SDK.NIM.getInstance({
    debug: true,
    appKey: 'ffa917c9f0409333abd0cbc2dc197df1',
    account: account,
    token: token,
    // privateConf: {}, // 私有化部署方案所需的配置
    onconnect: onConnect,
    onwillreconnect: onWillReconnect,
    ondisconnect: onDisconnect,
    onerror: onError,
    onsyncdone: onSyncDone,
    onfriends: onFriends,
    onusers: onusers,
    onteams: onteams,
    onroamingmsgs: onroamingmsgs,
    onofflinemsgs: onofflinemsgs,
    onmsg: onmsg,
    onsessions: onSessions,
    onupdatesession: onUpdateSession,
  });

  function onConnect(_data) {
    localStorage.setItem('im-account', account);
    localStorage.setItem('im-token', token);
    data.connect = _data;
    console.log('连接成功');
  }

  function onWillReconnect(obj) {
    // 此时说明 SDK 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
    console.log('即将重连');
    console.log(obj.retryCount);
    console.log(obj.duration);
  }

  function onDisconnect(error) {
    // 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
    console.log('丢失连接');
    console.log(error);
    if (error) {
      switch (error.code) {
        // 账号或者密码错误, 请跳转到登录页面并提示错误
        case 302:
          break;
          // 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误
        case 417:
          break;
          // 被踢, 请提示错误后跳转到登录页面
        case 'kicked':
          break;
        default:
          break;
      }
    }
  }

  function onError(error) {
    console.log(error);
  }

  function onSyncDone() { //同步完成处理
    sync = true;
    var callback;
    // while (callback = callbacks.unshift()) {
    //   callback(data);
    // }
    console.log('同步完成1', data);
    //添加好友
    // nim.addFriend({
    //   account: '612904',
    //   ps: 'ps',
    //   done: addFriendDone
    // });

    nim.getFriends({
      done: getFriendsDone
    });


  }

  function getFriendsDone(error, friends) {
    console.log('获取好友列表' + (!error ? '成功' : '失败'), error, friends);
    if (!error) {
      onFriends(friends);
    }
  }

  function addFriendDone(error, obj) {
    console.log('直接加为好友' + (!error ? '成功' : '失败'), error, obj);
    // if (!error) {
    //   onAddFriend(obj.friend);
    // }
  }


  function onFriends(friends) {

    data.friends = nim.cutFriends(data.friends, friends.invalid);
    data.friends = nim.mergeFriends(data.friends, friends);
    // refreshFriendsUI();
  }


  function onusers(_data) { //同步好友对应的用户名片列表
    data.users = _data;
  }

  function onteams(_data) { //同步群列表
    console.log('收到群列表');
    data.teams = _data;
  }

  function onroamingmsgs(_data) { //同步漫游消息
    pushMsg(_data.msgs);
  }

  function onofflinemsgs(_data) { //收到离线消息
    pushMsg(_data.msgs);
  }

  function onmsg(_data) { //收消息
    pushMsg(_data);
    //通知界面刷新
    switch (_data.type) {
      case 'custom':
        onCustomMsg(_data);
        break;
      case 'notification':
        // 处理群通知消息
        // onTeamNotificationMsg(_data);
        break;
      case 'text':
        //缓存中读取数据

        let count = parseInt(
          localStorage.getItem(localStorage.zyUserId + "_" + "from_" + _data.from + "_msg_count")
        ) || 0;
        count += 1;
        localStorage.setItem(localStorage.zyUserId + "_" + "from_" + _data.from + "_msg_count", count + "");

        //存入数据
        localStorage.setItem(
          localStorage.zyUserId +
          "_" +
          "from_msg_" + _data.from + "_" + count + "_",
          JSON.stringify(_data)
        );

        let session = localStorage.getItem(
          localStorage.zyUserId + "_" + "session"
        );
        if (session) {
          session = JSON.parse(session);
        } else {
          session = {};
        }
        session[_data.from] = JSON.stringify(_data);
        localStorage.setItem(
          localStorage.zyUserId + "_" + "session",
          JSON.stringify(session)
        );

        Event.$emit('onmsg_' + _data.from, _data);
        // 其它case
      default:
        break;
    }
  }
};
//获取同步数据
export function getIMData(callback) {
  if (!nim) {
    im_ini();
  }
  console.log(sync)
  if (sync) {
    callback(data);
  } else {
    callbacks.push(callback);
  }
};

export function getEvent(callback) {
  callback(Event);
};

export function getIMMsg(sessionId, callback) {
  getIMData(function (data) {
    if (data.msgs && data.msgs.hasOwnProperty(sessionId)) {
      callback(data.msgs[sessionId]);
      return;
    }
    callback({});
  });
};

/**
 * 获取消息
 * @param {*} scene 场景
 * @param {*} account 账号或群ID
 * @param {*} callback 获取消息回调
 */
export function getMsgs(scene, account, callback) {
  getIMData(function (data) {
    var sessionId = scene + '-' + account;
    callback(data.msgs[sessionId] || {});
  });

}
//合并消息，用于切换聊天加载聊天记录
function pushMsg(msgs) {
  if (!Array.isArray(msgs)) {
    msgs = [msgs];
  }
  var sessionId = msgs[0].sessionId;
  data.msgs = data.msgs || {};
  data.msgs[sessionId] = nim.mergeMsgs(data.msgs[sessionId], msgs);
}


function onSessions(sessions) {
  console.log('收到会话列表', sessions);
  data.sessions = nim.mergeSessions(data.sessions, sessions);
}

function onUpdateSession(session) {
  console.log('会话更新了', session);
  data.sessions = nim.mergeSessions(data.sessions, session);
}

/**
 * 获取消息
 * @param {*} account 账号
 * @param {*} desc 描述id
 * @param {*} callback 获取消息回调
 */
export function addFriend(account, desc, callback) {
  if (!nim) {
    im_ini();
  }

  nim.addFriend({
    account: account,
    ps: 'ps-------------',
    done: callback
  });
  (callback && typeof (callback) === "function") && callback();
}

function addFriendDone(error, obj) {
  Toast({
    message: '直接加为好友' + error,
    duration: 2000
  });
  console.log('直接加为好友' + (!error ? '成功' : '失败'), error, obj);
  // if (!error) {
  //     onAddFriend(obj.friend);
  // }
}

export function addTeam(name, callback) {
  if (!nim) {
    im_ini();
  }
  nim.createTeam({
    type: 'normal',
    name: '普通群',
    avatar: 'avatar',
    accounts: ['15824123371', '15314633070'],
    ps: '我建了一个普通群',
    done: createTeamDone
  });
  (callback && typeof (callback) === "function") && callback();
}

export function addTeamMember(teamId, account, callback) {
  console.info("=====dsfdsfdsfsd====", teamId, account)
  if (!nim) {
    im_ini();
  }
  nim.addTeamMembers({
    teamId: teamId,
    accounts: ['15314633070'],
    ps: '加入我们的群吧',
    done: addTeamMembersDone
  });
  (callback && typeof (callback) === "function") && callback();
}

function addTeamMembersDone(error, obj) {
  console.log('入群邀请发送' + (!error ? '成功' : '失败'), error, obj);
}


function createTeamDone(error, obj) {
  console.log('创建' + obj.team.type + '群' + (!error ? '成功' : '失败'), error, obj);
  if (!error) {
    onCreateTeam(obj.team, obj.owner);
  }
}


// nim.getChatroomAddress({
//   chatroomId: 'chatroomId',
//   done: getChatroomAddressDone
// });

function getChatroomAddressDone(error, obj) {
  console.log('获取聊天室地址' + (!error ? '成功' : '失败'), error, obj);
}

//发消息
export function send(account, msg, type = 'text', callback = null) {
  if (!nim) {
    im_ini();
    getIMData(function () {
      send(account, msg, type, sendMsgDone);
    });
    return;
  }
  //完成处理
  function sendMsgDone(error, msg) {
    callback && callback(error, msg);
    if (!error) {
      pushMsg(msg);
    }
  }


  function savaLastMsg(strMsg) {

  }

  /*
   scene来标明消息所属的场景:
  'p2p' (点对点消息)
  'team' (群消息)
  */
  /**
   type来标明消息的类型, 具体类型如下:
    'text' (文本消息)
    'image' (图片消息)
    'audio' (音频消息)
    'video' (视频消息)
    'file' (文件消息)
    'geo' (地理位置消息)
    'custom' (自定义消息)
    'tip' (提醒消息)
    提醒消息用于会话内的状态提醒，如进入会话时出现的欢迎消息，或者会话命中敏感词后的提示消息等等.
    'robot' (AI机器人消息)
    'notification' (群通知消息)
   */
  switch (type) {
    case 'text':
      var msg = nim.sendText({
        scene: 'p2p',
        to: account,
        text: msg,
        done: sendMsgDone
      });
      break;
  }
};
